iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Mobile Development

攜手神隊友ChatGPT:攝護腺自我照護App開發歷程!系列 第 12

D12-慢活片刻,Dart x Flutter 學習之旅

  • 分享至 

  • xImage
  •  

Part1:今日目標

1.前言
2.Dart語言學習: Flutter生命週期方法:initState()、Flutter 中其他常見的生命週期方法、單一模式(Singleton class)

Part2:今日內容

1.前言

今天的鐵人賽文章,應該是昨天的內容,但實在昨天文章: D11-實戰指南: 帶著 SQLite 踏上偉大的航道吧!內容已經太多,加上今天下班要和同事一起參加期待的烤肉大會,所以就把內容搬來當作今天的文章囉,小小偷懶一下😝

今天內容將會講解昨天文章有使用到的技巧和相關背景知識,讓我們開始吧!

2.Dart語言學習:

(1) Flutter生命週期方法:initState()

// 是一個生命週期方法,當這個狀態對象被創建時會自動調用
  void initState() {
    super.initState();
    // 使用單一模式的實例 (Use singleton instance)
    _scoreHistoryDB = ScoreHistoryDB
        .instance; // _scoreHistoryDB 變數被初始化為 ScoreHistoryDB.instance
    // 這表示使用單一模式的方式來獲取 ScoreHistoryDB 的實例,用於與分數歷史記錄資料庫進行交互
  }

這段程式碼出現在 _ScoreHistoryDBPageState 類別的 initState() 方法中,這是 Flutter 中的一個生命週期方法,當狀態對象(state object)被創建時,它會自動被調用。

在這個方法中,主要執行了以下操作:

  • super.initState():這是調用父類 StateinitState() 方法。這是必要的,因為 Flutter 的生命週期方法通常都需要調用父類的對應方法,以確保正確的生命週期順序。

  • _scoreHistoryDB 初始化:這行程式碼初始化了 _scoreHistoryDB 變數,這個變數用於與分數歷史記錄資料庫進行交互。換句話說,它將 _scoreHistoryDB 變數設置為 ScoreHistoryDB.instance

  • ScoreHistoryDB 是一個自定義的類別,代表了分數歷史記錄的資料庫。在這個類別中,實現了單一模式,這意味著只有一個 ScoreHistoryDB 實例存在於應用程式中。

  • .instanceScoreHistoryDB 類別的一個靜態 getter 方法。通過調用這個方法,可以獲取 ScoreHistoryDB 的單一實例。

總結,這段程式碼的目的是在 _ScoreHistoryDBPageState 狀態對象被創建時,初始化 _scoreHistoryDB 變數,以便在後續的操作中使用這個實例來進行分數歷史記錄資料庫的操作。這種方式確保了只有一個資料庫實例存在於應用程式中,並且可以在整個生命週期中共享和重複使用這個實例。

(2) Flutter中常見的生命週期方法(Common Lifecycle Methods in Flutter)

這些方法用於管理 widget 和狀態(State)的生命週期:

  • initState():

    • 在 widget 的狀態對象(State)被創建時調用。
    • 用於執行初始化操作,如: 設置初始狀態或建立連接。
  • didChangeDependencies():

    • 當 widget 依賴的數據或主題發生變化時調用。
    • 常用於當 widget 需要根據數據的變化來更新自身的狀態或 UI。
  • build():

    • 用於構建 widget 的 UI,每個 widget 都必須實現 build 方法,這是一個必要的規定,意味在自定義 widget 類別中,必須提供一個 build 方法來定義該 widget 的外觀和介面。。
    • 在每次需要重新構建 UI 時都會被調用。
  • didUpdateWidget():

    • 當 widget 的配置發生變化時(例如接收到新的屬性),會調用這個方法。
    • 常用於在配置變化時更新狀態。
  • setState():

    • 用於通知 Flutter 框架重新構建 UI。
    • 當 UI 需要更新以反映新的狀態時調用。
  • dispose():

    • 在 widget 被永久從樹中移除時(例如頁面切換)調用。「樹」指的是 widget tree。widget tree 是一種層次結構,用於表示 Flutter 應用程式的 UI 界面,其中包含了各種 widget ,這些 widget 按照父子關係排列,形成了一個樹狀結構。
    • 舉例來說,考慮一個簡單的應用程式,其中包含一個頁面(Page),頁面上包含了一個標題欄(AppBar)和一個列表(ListView)widget。在這種情況下,widget tree 可能如下所示:
      - MaterialApp
        - Scaffold
          - AppBar
          - ListView
            - ListTile
            - ListTile
            - ...
      
      在這個範例中,MaterialApp 是整個應用程式的 root widget ,Scaffold 是頁面的結構,AppBar 是頁面的頂部導航欄,ListView 包含了多個 ListTile child widget ,它們用於顯示列表中的項目。
    • 常用於執行資源釋放操作,如關閉連接或停止計時器。
  • deactivate():

    • 當某個 widget 被從畫面中移除(例如,切換到了另一個頁面),但該 widget 的實例仍然存在記憶體中時,deactivate() 方法會被觸發。當 widget 不再處於當前顯示的 widget tree 中時,Flutter 會調用 deactivate() 方法,但它的實例仍然可以在後續的操作中被重新加入 widget tree ,而不需要重新創建。
    • 通常伴隨著 widget 的移除或切換到另一個頁面。
  • didChangeAppLifecycleState():

    • 當應用程式的生命週期狀態發生變化時(例如進入後台或前台),會調用這個方法。
    • 常用於執行相應的操作,如暫停動畫或監聽生命週期事件。

這些生命週期方法可以幫助在 Flutter 應用程式中管理 widget 和狀態的行為,確保它們在適當的時候執行相應的操作以實現所需的功能和行為。根據 widget 的用途和需求,可以選擇使用這些方法中的一個或多個。

(3) 單一模式(Singleton class)

「單一類」或「單一模式」是一種軟體設計模式,目的是確保在應用程式運行期間只存在一個特定類別的實例。這種設計模式常用於需要共享資源或控制一些全域狀態的情況,以確保資源的一致性並防止不必要的資源重複建立。

以下是一個簡單的 Dart 範例,展示了如何實現一個單一類:

`class MySingleton {
  // 私有的構造函式,防止外部實例化
  MySingleton._privateConstructor();

  // 單一實例變數
  static final MySingleton _instance = MySingleton._privateConstructor();

  // 靜態工廠函式,用來取得單一實例"
  factory MySingleton() {
    return _instance;
  }

  // 其他方法和屬性可以在這裡添加
}` 

在這個範例中,MySingleton 類別使用了一個私有的構造函式 _privateConstructor,以確保只能在類內部創建實例。它還使用了一個靜態變數 _instance 來保存唯一的實例。最後,通過一個靜態工廠方法 factory MySingleton() 來獲取單一實例。

因此,無論在應用程式的任何地方,只要調用 MySingleton() 就可以獲取到同一個 MySingleton 實例,確保了單一模式的實現。

Always listen to your heart because even though it’s on your left side, it’s always right.
總是聽從內心的聲音。因為即便它長在你的左邊,它卻總是對的

買了一個重低音隨身型藍芽喇叭,邊做事邊聽歌超讚😍😍😍
今天要聽 Justin Bieber的《Anyone》


上一篇
D11-實戰指南,帶著 SQLite 踏上偉大的航道吧!
下一篇
D13-從數據到畫布,Flutter視覺化套件
系列文
攜手神隊友ChatGPT:攝護腺自我照護App開發歷程!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言